package cn.yudao.system.service.impl;

import cn.yudao.system.domain.Menu;
import cn.yudao.system.domain.Role;
import cn.yudao.system.mapper.MenuMapper;
import cn.yudao.system.mapper.RoleMapper;
import cn.yudao.system.service.IRoleService;
import cn.yudao.basic.service.impl.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author yudao
 * @since 2022-07-11
 */
@Service
public class RoleServiceImpl extends BaseServiceImpl<Role> implements IRoleService {
    @Autowired
    private RoleMapper roleMapper;

    @Autowired
    private MenuMapper menuMapper;

    /**
    * @Title: loadTree
    * @Description: 获取menu菜单的树状结构
    * @Author: Mr.Jia
    * @Version: 1.0
    * @Date:  2022/7/13 15:22
    * @Parameters:
    * @Return
    */
    @Override
    public List<Menu> loadTree() {
        // 查询所有的menu
        List<Menu> menus = menuMapper.LoadAll();
        // 创建一个map集合
        Map<Long, Menu> map = new HashMap<>();
        // 遍历所有的menu
        for (Menu menu : menus) {
            // 将menus装到map中
            map.put(menu.getId(), menu);
        }
        // 创建一个集合
        List<Menu> menuTree = new ArrayList<>();
        // 遍历集合
        for (Menu menu : menus) {
            if (menu.getParentId() == null) {
                menuTree.add(menu);
            } else {
                Menu menu1 = map.get(menu.getParentId());
                if (menu1 != null) {
                    menu1.getChildren().add(menu);
                }
            }
        }
        return menuTree;
    }

    /**
    * @Title: save
    * @Description: 新增
    * @Author: Mr.Jia
    * @Version: 1.0
    * @Date:  2022/7/13 11:48
    * @Parameters:
    * @Return
    */
    @Override
    public void save(Role role) {
        roleMapper.save(role);
        saveRelation(role);
    }

    /**
    * @Title: saveRelation
    * @Description: 同步新增role的关联表
    * @Author: Mr.Jia
    * @Version: 1.0
    * @Date:  2022/7/13 11:45
    * @Parameters:
    * @Return
    */
    private void saveRelation(Role role) {
        if (role.getMenus() != null){
            // 将数据重新添加到关联表
            roleMapper.saveRoleMenu(role.getId(),role.getMenus());
        }
        if (role.getPermissions() != null){
            // 将数据重新添加到关联表
            roleMapper.saveRolePermission(role.getId(),role.getPermissions());
        }
    }

    @Override
    public void upadte(Role role) {
        roleMapper.upadte(role);
        // 使用方法进行init 对关联表进行同步修改
        initUpdateRelationRole(role);
    }

    /**
    * @Title: initUpdateRelationRole
    * @Description: 同步修改role和菜单权限的关联表
    * @Author: Mr.Jia
    * @Version: 1.0
    * @Date:  2022/7/13 15:08
    * @Parameters:
    * @Return
    */
    private void initUpdateRelationRole(Role role) {
        if (role.getMenus() != null){
            // 删除关联表中的数据
            roleMapper.RoleRemoveMenu(role.getId());
            // 将数据重新添加到关联表
            roleMapper.saveRoleMenu(role.getId(),role.getMenus());
        }
        if (role.getPermissions() != null){
            roleMapper.RoleRemovePermission(role.getId());
            // 将数据重新添加到关联表
            roleMapper.saveRolePermission(role.getId(),role.getPermissions());
        }
    }

    @Override
    public void removeById(Long id) {
        removeRelation(id);
        roleMapper.removeById(id);
    }

    /**
    * @Title: removeRelation
    * @Description: 同步role删除关联表数据
    * @Author: Mr.Jia
    * @Version: 1.0
    * @Date:  2022/7/13 11:47
    * @Parameters:
    * @Return
    */
    private void removeRelation(Long id) {
        // 删除关联表中的数据
        roleMapper.RoleRemoveMenu(id);
        roleMapper.RoleRemovePermission(id);
    }
}
